package com.tanhua.app.service;

import com.tanhua.api.UserInfoApi;
import com.tanhua.app.exception.BusinessException;
import com.tanhua.config.template.FaceTemplate;
import com.tanhua.config.template.OssTemplate;
import com.tanhua.model.pojo.UserInfo;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.model.vo.UserInfoVo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Service
public class UserInfoService {

    @DubboReference
    private UserInfoApi userInfoApi;

    @Autowired
    private OssTemplate ossTemplate;

    @Autowired
    private FaceTemplate faceTemplate;


    /**
     * Service层实现用户信息的增加
     * @param userInfo
     */
    public void save(UserInfo userInfo) {
        userInfoApi.save(userInfo);
    }

    /**
     * 上传用户图片（根据用户的id上传图片）
     * @param headPhoto
     * @param id
     */
    public void updateHead(MultipartFile headPhoto, Long id) throws IOException {
        //1.将图片上传到阿里云存储，注入对象
        String imageUrl = ossTemplate.upload(headPhoto.getInputStream(), headPhoto.getOriginalFilename());

        //2.通过百度云判断上传的图片是否含有人脸，注入对象
        boolean detect = faceTemplate.detect(imageUrl);

        //不含人脸，抛出异常
        if (!detect){
            throw new BusinessException(ErrorResult.faceError());
        }

        //存在人脸，保存图像到数据库中
        UserInfo userInfo = new UserInfo();
        userInfo.setId(id);
        userInfo.setAvatar(imageUrl);
        //调用数据访问层方法
        userInfoApi.update(userInfo);

    }

    /**
     * 查询用户信息（通过UserInfo的实体类查询用户信息发现有些内容无法在前端页面展示，是因为字段 数量/类型/名称 不一致导致的
     * 所以需要通过一个Vo类重写定义UserInfo）
     * @param userId
     * @return
     */
//    public UserInfo findById(Long userId) {
//        UserInfo userInfo = userInfoApi.findById(userId);
//        return userInfo;
//    }
    public UserInfoVo findById(Long userId) {
        UserInfo userInfo = userInfoApi.findById(userId);
        //1.创建UserInfoVo对象
        UserInfoVo userInfoVo = new UserInfoVo();

        //2.把UserInfo数据复制到UserInfoVo中(该复制只会把属性类型相同的复制上去，age不会复制上去)
        BeanUtils.copyProperties(userInfo,userInfoVo);

        //3.判断字段名不一样的属性是否存在值（如：age）
        if (userInfo.getAge() != null) {
            //存在，则进行转化
            userInfoVo.setAge(userInfo.getAge().toString());
        }
        return userInfoVo;
    }

    /**
     * 修改用户信息
     * @param userInfo
     */
    public void updateById(UserInfo userInfo) {
        userInfoApi.update(userInfo);
    }
}
